package cn.bocai.pc.web.controller;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintStream;
import java.text.SimpleDateFormat;
import java.util.Calendar;

public class DatabaseBackup {  
    /** 
     *  
     * @param dbdir mysql数据库安装路径 
     * @param dbname  数据库的名称 
     * @param backdir 备份的目录 
     */  
    public static void backup(String dbdir, String dbname, String backdir) {  
        Calendar calendar = Calendar.getInstance();  
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy_MM_dd_HHmmss");  
        String currentTime = dateFormat.format(calendar.getTime());  
        try {  
            long startTime = System.currentTimeMillis();  
            Runtime rt = Runtime.getRuntime();  
            Process child = rt  
                    .exec(dbdir + "/bin/mysqldump --default-character-set=utf8 -uroot -proot "+ dbname);  
            InputStream in = child.getInputStream();  
            InputStreamReader xx = new InputStreamReader(in, "utf8");  
  
            FileOutputStream fout = new FileOutputStream(new File(backdir, dbname + "_" + currentTime + ".sql"));  
            OutputStreamWriter writer = new OutputStreamWriter(fout, "utf8");  
  
            dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
  
            writer.write("-- Dump by Microsoul at " + dateFormat.format(calendar.getTime()) + "\r\n");  
  
            String inStr;  
            BufferedReader br = new BufferedReader(xx);  
            // 这样实时写入文件很重要，网上有很多是将读取的存入字符串中，最后再写成文件，这样会导致Java的堆栈内存溢出。  
            while ((inStr = br.readLine()) != null) {  
                writer.write(inStr);  
                writer.write("\r\n");  
            }  
  
            writer.write("\r\n-- Use " + (System.currentTimeMillis() - startTime) + "ms\r\n");  
  
            writer.flush();  
            in.close();  
            xx.close();  
            br.close();  
            writer.close();  
            fout.close();  
        } catch (Exception e) {  
            PrintStream print = null;  
            try {  
                print = new PrintStream(new File(backdir, currentTime + "_backup_err.log"));  
                dateFormat.applyPattern("yyyy-MM-dd HH:mm:ss");  
                currentTime = dateFormat.format(calendar.getTime());  
                print.println(currentTime + "  backup failed.");  
                e.printStackTrace(print);  
                print.flush();  
            } catch (IOException e2) {  
  
            } finally {  
                if (print != null) {  
                    print.close();  
                }  
            }  
        }  
  
    }  
}

